const obj = {
    date: [2, 4, 6],
    teachers: {
      韩老师: "webpack,mp,perf",
      高老师: "react",
      夏老师: "nodejs,wechat,safe",
      罗老师: "rn",
      盛老师: "test,interview,end,project,algorithm,pattern,react-src",
      杨老师: "vue"
    },
    details: [
      {
        title: "vue01 组件化实践",
        content: `
              组件化技术大盘点
              通用组件设计思路
              element-ui体验
              实现自己的el-form
              弹框类组件实现及原理
              递归组件及应用之树形菜单
              element源码学习
              `,
        catg: "vue"
      },
      {
        title: "vue02 全家桶原理剖析",
        content: `
              vue-router需求分析
              vue-router源码实现
              vuex设计理念及需求分析
              vuex源码实现
            `,
        catg: "vue"
      },
      {
        title: "vue03 手写Vue",
        content: `
              MVVM设计理念和要素分析
              响应式原理及实现
              实现自己的vue
              vue中的数据响应式
              模板语法及编译 
              依赖收集及视图更新       
            `,
        catg: "vue"
      },
      {
        title: "vue04 vue源码剖析01",
        content: `
              开发调试环境准备
              入口文件查找
              vue初始化流程
              响应式原理
          `,
        catg: "vue"
      },
      {
        title: "vue05 vue源码剖析02",
        content: `
              异步更新策略
              虚拟DOM
              diff算法
          `,
        catg: "vue"
      },
      {
        title: "vue06 vue源码剖析03",
        content: `
              编译器原理
              常见指令工作原理
              组件机制
              事件机制
              双向绑定原理
            `,
        catg: "vue"
      },
      {
        title: "vue07 服务端渲染SSR",
        content: `
              服务端渲染原理
              vue ssr实战
              nuxt.js
              `,
        catg: "vue"
      },
      {
        title: "vue08 TypeScript实战",
        content: `
              ts核心语法
              ts+vue实战
              装饰器及其原理
              vue-property-decorator源码分析
          `,
        catg: "vue"
      },
      {
        title: "vue09 vue项目最佳实践",
        content: `
              配置策略
              权限控制
              动态路由
              动态导航菜单
              请求服务封装
              数据Mock
              请求代理
              测试                    
            `,
        catg: "vue"
      },
      {
        title: "vue10 vue3初探+响应式原理剖析",
        content: `
              调试环境搭建
              vue3
              Composition API
              响应式原理剖析
              展望
            `,
        catg: "vue"
      },
      {
        title: "休息",
        content: `
           休息
               `,
  
        catg: "rest"
      },
      {
        title: "React01 React组件化",
        content: `
                  1.组件跨层级通信
                  2.设计并实现表单控件
                  3.高阶组件  
                  4.实现弹窗类组件`,
        catg: "react"
      },
      {
        title: "React02 Redux、中间件的使用及源码",
        content: `
                1.使用redux
                2.使用redux中间件
                3.实现redux、中间件`,
        catg: "react"
      },
      {
        title: "React03 Hooks和react-redux使用及源码",
        content: `
                1.Hooks API
                2.react-redux使用
                3.实现react-redux
                4.react-router使用`,
        catg: "react"
      },
      {
        title: "React04 react-router使及源码",
        content: ` 
                1.react-router使用
                2.路由守卫
                3.路由hooks方法使用及实现
                4.实现Router、BrowserRouter、HashRouter、Route、Link、Switch、Redirect等`,
        catg: "react"
      },
      {
        title: "React05 企业级最佳实践01",
        content: `
                1.generator
                2.redux-saga
                3.项目搭建`,
        catg: "react"
      },
      {
        title: "React06 企业级最佳实践02",
        content: `
              1.umi+dva搭建项目
              2.路由配置
              3.按需加载
              4.umi+dva核心原理解析`,
        catg: "react"
      },
      {
        title: "React07 React原理解析01",
        content: `
                1.虚拟DOM
                2.JSX
                3.React核心API查看
                4.实现React.createElement, ReactDom.render, Component`,
        catg: "react"
      },
      {
        title: "React08 React原理解析02",
        content: `
                1.协调
                2.diff
                3.fiber结构实现初次渲染`,
        catg: "react"
      },
      {
        title: "React09 React原理解析03",
        content: `
                1.Hook原理
                2.fiber结构实现更新
                3.FunctionComponent源码解读`,
        catg: "react"
      },
      {
        title: "React10 React原理解析04",
        content: `
                1.React源码中的协调解读与实现
                2.任务调度流程
                3.合成事件
                4.setState的同步与异步
                5.常见组件优化技术总结`,
        catg: "react"
      },
      {
        title: "Nodejs01 基础API与CLI",
        content: `
                异步I/O Stream Buffer Http
                手写一个CLI工具
                `,
        catg: "nodejs"
      },
      {
        title: "Nodejs02 Koa源码",
        content: `
          context上下文
          中间件机制
          router中间件
          静态服务中间件
        `,
        catg: "nodejs"
      },
      {
        title: "Nodejs03 网络编程",
        content: `
                  socket套接字编程
                  http协议 跨域 反向代理 爬虫 反向代理 bodyparser
                  上传原理
                  websocket
        `,
        catg: "nodejs"
      },
      {
        title: "Nodejs04 Mysql",
        content: `
                  mysql 
                  sequelize
                  电商sequlize实战
                  `,
        catg: "nodejs"
      },
      {
        title: "Nodejs05 Mongoose",
        content: `
                  mongo native
                  mongoose
                  零编码Restful
                `,
        catg: "nodejs"
      },
      {
        title: "Nodejs06 鉴权",
        content: `
                  cookie-session
                  token jwt原理解析
                  扩展Oauth2 与 SSO单点登录
        `,
        catg: "nodejs"
      },
      {
        title: "Nodejs07 eggjs原理解析",
        content: `
                  实现一个MVC框架
                  约定优于配置 控制器层 服务层 实体层
                  定时器 中间件
        `,
        catg: "nodejs"
      },
      {
        title: "Nodejs08 eggjs最佳实践",
        content: `
                  swager 接口文档
                  plugin
                  restful服务
                  表单校验
                  jwt鉴权
                  生命周期函数 初始化数据
                  上传upload
        `,
        catg: "nodejs"
      },
      {
        title: "Nodejs09 手写TS装饰器",
        content: `
                  装饰器与AOP
                  路由装饰器
                  校验装饰器
                  模型装饰器
        `,
        catg: "nodejs"
      },
      {
        title: "Nodejs10 部署_Docker_自动化部署",
        content: `
                    部署 cluster模块、PM2、静态服务、反向代理
                    docker基础
                    github webhooks 自动化部署
                    `,
        catg: "nodejs"
      },
      {
        title: "项目课",
        content: `
          项目先导课
          整体架构分析
                    `,
        catg: "project"
      },
      {
        title: "微信公众号开发",
        content: `
                  ngrok
                  消息接口
                  服务器端接口调用
        `,
        catg: "wechat"
      },
      {
        title: "前端安全 常见攻击手段攻防演练",
        content: `
                  XSS、CSRF、点击劫持、SQL注入、OS注入、DDOS简介
        `,
        catg: "safe"
      },
      {
        title: "工程化01",
        content: "工程化01",
        catg: "webpack"
      },
      {
        title: "工程化02 进阶",
        content: "工程化02",
        catg: "webpack"
      },
      {
        title: "工程化03",
        content: "工程化03",
        catg: "webpack"
      },
      {
        title: "工程化04",
        content: "工程化03",
        catg: "webpack"
      },
      {
        title: "工程化05",
        content: "webpack源码",
        catg: "webpack"
      },
      {
        title: "React-native01",
        content: "React-native01",
        catg: "rn"
      },
      {
        title: "React-native02",
        content: "React-native02",
        catg: "rn"
      },
      {
        title: "React-native03",
        content: "React-native03",
        catg: "rn"
      },
      {
        title: "React-native04",
        content: "React-native04",
        catg: "rn"
      },
      {
        title: "flutter01",
        content: "flutter实战",
        catg: "rn",
      },
      {
        title: "flutter02",
        content: "flutter实战",
        catg: "rn",
      },
      {
        title: "flutter03",
        content: "flutter实战",
        catg: "rn",
      },
      {
        title: "flutter04",
        content: "flutter实战",
        catg: "rn",
      },
      {
        title: "小程序01",
        content: "小程序入门",
        catg: "mp"
      },
      {
        title: "小程序02",
        content: "小程序入门",
        catg: "mp"
      },
      {
        title: "性能分析",
        content: "性能分析",
        catg: "perf"
      },
  
      {
        title: "前端自动化测试01",
        content: "前端自动化测试01",
        catg: "test"
      },
  
      {
        title: "面试",
        content: "面试",
        catg: "interview"
      },
      {
        title: "结课",
        content: "结课",
        catg: "end"
      }
    ]
  };
  const catgTeachers = {};
  Object.entries(obj.teachers).forEach(val => {
    const [name, catg] = val;
    catg.split(",").forEach(v => {
      catgTeachers[v] = name;
    });
  });
  obj.details.map(v => {
    v.teacher = catgTeachers[v.catg];
    return v;
  });
  console.log("20", obj.details.length);
  
  export default obj;
  